package lucky.xiong.煞笔面试题.JUC.threadLocal;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @author XiongJianLin
 * @date Created in 2025/2/27 10:54
 */
public class 创建线程的基本方式 {

    public static void main(String[] args) {
        // 1
        ExtendThread extendThread = new ExtendThread();
        extendThread.start();
        //2
        ImplementsRunnable implementsRunnable = new ImplementsRunnable();
        implementsRunnable.run();
        //3
        /**
         * ExecutorService、Callable<Class>、Future有返回值线程
         * 有返回值的任务必须实现Callable接口，类似的，无返回值的任务必须Runnable接口。执行
         * Callable任务后，可以获取一个Future的对象，在该对象上调用get就可以获取到Callable任务
         * 返回的Object了，再结合线程池接口ExecutorService就可以实现中有返回结果的多线程。
         */
        int taskSize = 2;
        // 其中newFixedThreadPool使用的是 LinkedBlockingQueue ， 无界队列。

        ExecutorService pool = Executors.newFixedThreadPool(taskSize);
        // 创建多个有返回值的任务
        List<Future> list = new ArrayList<Future>();
        for (int i = 0; i < taskSize; i++) {
            Callable c = new MyCallable(i + " ");
            // 执行任务并获取Future对象
            Future f = pool.submit(c);
            list.add(f);
        }
        pool.shutdown();
        System.out.println(list);


    }
}


/**
 * Thread 类本质上是实现了Runnable接口的一个实例，代表一个线程的实例。启动线程的唯一方
 * 法就是通过Thread类的start()实例方法。start()方法是一个native方法，它将启动一个新线
 * 程，并执行run()方法。
 */
class ExtendThread extends Thread{
    public void run(){
        System.out.println("extends Thread : thread run");
    }
}

/**
 * 如果自己的类已经extends另一个类，就无法直接extends Thread，此时，可以实现一个
 * Runnable 接口。
 */
class ImplementsRunnable extends  Su7 implements Runnable{
    public void run(){
        System.out.println("implements Runnable : thread run");
    }
}


class MyCallable implements Callable{
    private String taskNum;

    public MyCallable(String taskNum) {
        this.taskNum = taskNum;
    }

    @Override
    public Object call() throws Exception {
        System.out.println("call()方法被自动调用！！！    " + taskNum);
        return taskNum;
    }
}